home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1995 #5 & #6
/
Amiga Plus CD - 1995 - No. 5 and 6.iso
/
pd
/
netz
/
term
/
extras
/
source
/
gtlayout-source.lha
/
LTP_NewMenu.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-25
|
4KB
|
191 lines
/* GadTools layout toolkit
**
** Copyright © 1993-1995 by Olaf `Olsen' Barthel
** Freely distributable.
**
** :ts=4
*/
#include "gtlayout_global.h"
#ifdef DO_MENUS
/* LTP_NewMenu():
*
* Create a new menu, based on the Screen and Font given.
*/
RootMenu * __regargs
LTP_NewMenu(struct Screen *Screen,struct TextAttr *TextAttr,struct Image *AmigaGlyph,struct Image *CheckGlyph,LONG *Error)
{
if(Screen)
{
APTR Pool;
// Start cleanly
*Error = 0;
// Wrap all the allocations into a pool
if(Pool = AsmCreatePool(MEMF_ANY | MEMF_PUBLIC | MEMF_CLEAR,1024,1024,SysBase))
{
struct RootMenu *Root;
// Create the root
if(Root = (struct RootMenu *)AsmAllocPooled(Pool,sizeof(struct RootMenu),SysBase))
{
Root -> Pool = Pool;
if(TextAttr)
Root -> TextAttr = TextAttr;
else
Root -> TextAttr = Screen -> Font;
// Open the menu font
if(Root -> Font = OpenFont(Root -> TextAttr))
{
// Get the drawing information
if(Root -> DrawInfo = GetScreenDrawInfo(Screen))
{
// Fill in the dummy rastport
InitRastPort(&Root -> RPort);
Root -> RPort . BitMap = Screen -> RastPort . BitMap;
SetFont(&Root -> RPort,Root -> Font);
// Get the text rendering pen
if(Root -> DrawInfo -> dri_Version < 2)
Root -> TextPen = Root -> DrawInfo -> dri_Pens[DETAILPEN];
else
Root -> TextPen = Root -> DrawInfo -> dri_Pens[BARDETAILPEN];
// Something to remember
Root -> Screen = Screen;
// Let's hope it won't grow in the future
CopyMem(Root -> TextAttr,&Root -> BoldAttr,sizeof(struct TTextAttr));
// Make it boldface
Root -> BoldAttr . tta_Style |= FSF_BOLD;
// Initialize the lists
NewList((struct List *)&Root -> MenuList);
NewList((struct List *)&Root -> ItemList);
// Get the glyph widths
if(CheckGlyph)
{
GetAttr(IA_Width, CheckGlyph,&Root -> CheckWidth);
GetAttr(IA_Height, CheckGlyph,&Root -> CheckHeight);
}
else
{
// No glyph is provided, use the default values
if(V39)
{
struct Image *Glyph;
if(Glyph = NewObject(NULL,SYSICLASS,
SYSIA_DrawInfo, Root -> DrawInfo,
SYSIA_Which, MENUCHECK,
SYSIA_ReferenceFont, Root -> Font,
TAG_DONE))
{
GetAttr(IA_Width, Glyph,&Root -> CheckWidth);
GetAttr(IA_Height, Glyph,&Root -> CheckHeight);
DisposeObject(Glyph);
}
}
if(!Root -> CheckWidth)
Root -> CheckWidth = 15;
if(!Root -> CheckHeight)
Root -> CheckHeight = 8;
}
if(AmigaGlyph)
{
GetAttr(IA_Width, AmigaGlyph,&Root -> AmigaWidth);
GetAttr(IA_Height, AmigaGlyph,&Root -> AmigaHeight);
}
else
{
// No glyph is provided, use the default values
if(V39)
{
struct Image *Glyph;
if(Glyph = NewObject(NULL,SYSICLASS,
SYSIA_DrawInfo, Root -> DrawInfo,
SYSIA_Which, AMIGAKEY,
SYSIA_ReferenceFont, Root -> Font,
TAG_DONE))
{
GetAttr(IA_Width, Glyph,&Root -> AmigaWidth);
GetAttr(IA_Height, Glyph,&Root -> AmigaHeight);
DisposeObject(Glyph);
}
}
if(!Root -> AmigaWidth)
Root -> AmigaWidth = 23;
if(!Root -> AmigaHeight)
Root -> AmigaHeight = 8;
}
// Establish default menu item height
Root -> ItemHeight = Root -> RPort . TxHeight;
if(Root -> CheckHeight > Root -> ItemHeight)
Root -> ItemHeight = Root -> CheckHeight;
if(Root -> AmigaHeight > Root -> ItemHeight)
Root -> ItemHeight = Root -> AmigaHeight;
Root -> ItemHeight += 2;
return(Root);
}
else
*Error = ERROR_NO_FREE_STORE;
CloseFont(Root -> Font);
}
else
*Error = ERROR_OBJECT_NOT_FOUND;
}
else
*Error = ERROR_NO_FREE_STORE;
AsmDeletePool(Pool,SysBase);
}
else
*Error = ERROR_NO_FREE_STORE;
}
else
*Error = ERROR_REQUIRED_ARG_MISSING;
return(NULL);
}
#endif /* DO_MENUS */